﻿\section{CPU}

\subsection{Предсказатели переходов}
\label{branch_predictors}

Некоторые современные компиляторы пытаются избавиться от инструкций условных переходов.
Примеры в этой книге: \myref{subsec:jcc_ARM}, \myref{chap:cond}, \myref{subsec:popcnt}.

Это потому что предсказатель переходов далеко не всегда работает идеально, поэтому, компиляторы и стараются
реже использовать переходы, если возможно.

\myindex{x86!\Instructions!CMOVcc}
\myindex{ARM!\Instructions!ADRcc}
Одна из возможностей --- это условные инструкции в ARM (как ADRcc), а еще инструкция CMOVcc в x86.

\subsection{Зависимости между данными}

Современные процессоры способны исполнять инструкции одновременно (\ac{OOE}), но для этого,
внутри такой группы, результат одних не должен влиять на работу других.
Следовательно, компилятор старается использовать инструкции с наименьшим влиянием на состояние процессора.

\myindex{x86!\Instructions!LEA}
Вот почему инструкция \LEA в x86 такая популярная --- 
потому что она не модифицирует флаги процессора,
а прочие арифметические инструкции --- модифицируют.

